/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Modelo;

import VO.EstadisticasVO;
import VO.VoluntarioVO;
import java.sql.SQLException;
import utiles.exceptions.DataBaseException;
import utiles.exceptions.InternalErrorException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Vector;
import javax.sql.DataSource;
import utiles.SQL.GeneralOperations;
import utiles.SQL.SimpleDataSource;

/**
 *
 * @author Jorge
 */
public class DaoVoluntario implements DaoVoluntarioInterface{

    //constructor
    public DaoVoluntario()
    {
    }

    public boolean ingresarVoluntario(VoluntarioVO nuevo) throws DataBaseException, InternalErrorException, SQLException {

        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;
        boolean resultado = false;
        
        try
        {
            String query = "CALL agregarVoluntario(?,?,?,?,?,?,?,?,?,?)";
            callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            callabledStatement = connection.prepareCall(query);
            callabledStatement.setString("rutN", nuevo.getRut());
            callabledStatement.setString("nombres",nuevo.getNombres());
            callabledStatement.setString("apellidos",nuevo.getApellidos());
            callabledStatement.setString("dir",nuevo.getDireccion());
            callabledStatement.setString("email",nuevo.getEmail());
            callabledStatement.setString("sangre",nuevo.getGrupoSanguineo());
            callabledStatement.setString("ingreso",nuevo.getFechaIngreso());
            callabledStatement.setString("retiro",nuevo.getFechaRetiro());
            callabledStatement.setString("nacimiento",nuevo.getFechaNacimiento());
            callabledStatement.setString("cargo",nuevo.getCargo());
            callabledStatement.execute();//se hace la consulta

            if(callabledStatement.getUpdateCount()>0) resultado = true;

        }
        catch (SQLException e)
        {
            resultado = false;
            System.out.println("sql EXCEPTION al ingresar voluntario --->" + e.getMessage());
            throw new InternalErrorException(e);            
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return resultado;
        }
    }

    public boolean modificarVoluntario(VoluntarioVO volModificado) throws DataBaseException, InternalErrorException, SQLException
    {
        boolean resultado = false;
        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;

        try
        {
            String query = "CALL modificarVoluntario(?,?,?,?,?,?,?,?,?,?,?)";
            callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            callabledStatement = connection.prepareCall(query);
            callabledStatement.setInt("idV", volModificado.getIdVoluntario());
            callabledStatement.setString("rutV", volModificado.getRut());
            callabledStatement.setString("nombresV",volModificado.getNombres());
            callabledStatement.setString("apellidosV",volModificado.getApellidos());
            callabledStatement.setString("dir",volModificado.getDireccion());
            callabledStatement.setString("emailV",volModificado.getEmail());
            callabledStatement.setString("sangre",volModificado.getGrupoSanguineo());
            callabledStatement.setString("ingreso",volModificado.getFechaIngreso());
            callabledStatement.setString("retiro",volModificado.getFechaRetiro());
            callabledStatement.setString("nacimiento",volModificado.getFechaNacimiento());
            callabledStatement.setString("cargoV",volModificado.getCargo());
            callabledStatement.execute();//se hace la consulta

            if(callabledStatement.getUpdateCount()>0) resultado = true;
        }
        catch (SQLException e)
        {
            resultado = false;
            System.out.println("sql EXCEPTION al modificar voluntario --->" + e.getMessage());
            throw new InternalErrorException(e);
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return resultado;
        }
    }

     public Vector cargarVoluntarios() throws DataBaseException, InternalErrorException, SQLException
     {
        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;
        ResultSet resultSet;
        Vector listaVoluntarios = new Vector();

        try
        {
            String query = "CALL cargarVoluntarios()";
            callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            callabledStatement = connection.prepareCall(query);
            callabledStatement.execute();//se hace la consulta

            if ((resultSet = callabledStatement.getResultSet()).isBeforeFirst() != false)
            {
                    while (resultSet.next()) {
                        VoluntarioVO nuevo = new VoluntarioVO();
                        nuevo.setIdVoluntario(resultSet.getInt("idvoluntario"));
                        nuevo.setRut(resultSet.getString("rut"));
                        nuevo.setNombres(resultSet.getString("nombres"));
                        nuevo.setApellidos(resultSet.getString("apellidos"));
                        nuevo.setDireccion(resultSet.getString("direccion"));
                        nuevo.setEmail(resultSet.getString("email"));
                        nuevo.setGrupoSanguineo(resultSet.getString("grupoSanguineo"));
                        nuevo.setFechaIngreso(resultSet.getString("fechaIngreso"));
                        nuevo.setFechaRetiro(resultSet.getString("fechaRetiro"));
                        nuevo.setFechaNacimiento(resultSet.getString("fechaDeNacimiento"));
                        nuevo.setCargo(resultSet.getString("cargo"));
                        listaVoluntarios.add(nuevo);
                    }
            }
        }
        catch (SQLException e)
        {
            listaVoluntarios = null;
            System.out.println("sql EXCEPTION al ingresar modificar voluntario --->" + e.getMessage());
            throw new InternalErrorException(e);
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return listaVoluntarios;
        }
     }
     
     public boolean eliminarVoluntario(VoluntarioVO nuevo) throws DataBaseException, InternalErrorException, SQLException {

        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;
        boolean resultado = false;
        
        try
        {
            String query = "CALL eliminarVoluntario(?,?)";
            callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            callabledStatement = connection.prepareCall(query);
            callabledStatement.setString("rutV", nuevo.getRut());
            callabledStatement.setString("retiro",nuevo.getFechaRetiro());
            callabledStatement.execute();//se hace la consulta

            if(callabledStatement.getUpdateCount()>0) resultado = true;

        }
        catch (SQLException e)
        {
            resultado = false;
            System.out.println("sql EXCEPTION al eliminar voluntario --->" + e.getMessage());
            throw new InternalErrorException(e);            
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return resultado;
        }
    }

    public Vector cargarVoluntariosVigentes() throws DataBaseException, InternalErrorException, SQLException
     {
        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;
        ResultSet resultSet;
        Vector listaVoluntarios = new Vector();

        try
        {
            String query = "CALL cargarVoluntariosVigentes()";
            callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            callabledStatement = connection.prepareCall(query);
            callabledStatement.execute();//se hace la consulta

            if ((resultSet = callabledStatement.getResultSet()).isBeforeFirst() != false)
            {
                    while (resultSet.next()) {
                        VoluntarioVO nuevo = new VoluntarioVO();
                        nuevo.setIdVoluntario(resultSet.getInt("idvoluntario"));
                        nuevo.setRut(resultSet.getString("rut"));
                        nuevo.setNombres(resultSet.getString("nombres"));
                        nuevo.setApellidos(resultSet.getString("apellidos"));
                        nuevo.setDireccion(resultSet.getString("direccion"));
                        nuevo.setEmail(resultSet.getString("email"));
                        nuevo.setGrupoSanguineo(resultSet.getString("grupoSanguineo"));
                        nuevo.setFechaIngreso(resultSet.getString("fechaIngreso"));
                        nuevo.setFechaNacimiento(resultSet.getString("fechaDeNacimiento"));
                        nuevo.setCargo(resultSet.getString("cargo"));
                        listaVoluntarios.add(nuevo);
                    }
            }
        }
        catch (SQLException e)
        {
            listaVoluntarios = null;
            System.out.println("sql EXCEPTION al cargar voluntario --->" + e.getMessage());
            throw new InternalErrorException(e);
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return listaVoluntarios;
        }
     }

    public VoluntarioVO cargarVoluntario(String rut) throws DataBaseException, InternalErrorException, SQLException
     {
        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;
        ResultSet resultSet;
        VoluntarioVO resultado = new VoluntarioVO();

        try
        {
            String query = "CALL cargarVoluntario(?)";
            callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            callabledStatement = connection.prepareCall(query);
            callabledStatement.setString("rutV", rut);
            callabledStatement.execute();//se hace la consulta

            if ((resultSet = callabledStatement.getResultSet()).isBeforeFirst() != false)
            {
                    while (resultSet.next()) {

                        resultado.setIdVoluntario(resultSet.getInt("idvoluntario"));
                        resultado.setRut(resultSet.getString("rut"));
                        resultado.setNombres(resultSet.getString("nombres"));
                        resultado.setApellidos(resultSet.getString("apellidos"));
                        resultado.setDireccion(resultSet.getString("direccion"));
                        resultado.setEmail(resultSet.getString("email"));
                        resultado.setGrupoSanguineo(resultSet.getString("grupoSanguineo"));
                        resultado.setFechaIngreso(resultSet.getString("fechaIngreso"));
                        resultado.setFechaRetiro(resultSet.getString("fechaRetiro"));
                        resultado.setFechaNacimiento(resultSet.getString("fechaDeNacimiento"));
                        resultado.setCargo(resultSet.getString("cargo"));
                    }
            }
        }
        catch (SQLException e)
        {
            resultado = null;
            System.out.println("sql EXCEPTION al cargar datos de un voluntario --->" + e.getMessage());
            throw new InternalErrorException(e);
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return resultado;
        }
     }

    public EstadisticasVO cargarEstadisticas(EstadisticasVO datosEstad) throws DataBaseException, InternalErrorException, SQLException{
        Connection connection = null;
        DataSource dataSource = new SimpleDataSource();
        connection = dataSource.getConnection();
        CallableStatement callabledStatement = null;
        ResultSet resultSet;
        EstadisticasVO resultado = new EstadisticasVO();

        try
        {
            if(datosEstad.getMes().compareTo("No especificado")==0){
                String query = "CALL cargarEstadisticasAno(?)";
                callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                callabledStatement = connection.prepareCall(query);
                callabledStatement.setString("anoE", datosEstad.getAnio());
            }
            else{
                String query = "CALL cargarEstadisticasMes(?,?)";
                callabledStatement = connection.prepareCall(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                callabledStatement = connection.prepareCall(query);
                callabledStatement.setString("anoE", datosEstad.getAnio());
                callabledStatement.setString("mesE", transformaMes(datosEstad.getMes()));
            }

            callabledStatement.execute();//se hace la consulta

            if ((resultSet = callabledStatement.getResultSet()).isBeforeFirst() != false)
            {
                    while (resultSet.next()) {

                        resultado.setAnio(datosEstad.getAnio());
                        resultado.setMes(datosEstad.getMes());
                        resultado.setNumeroIngresos(resultSet.getInt("INGRESOS"));
                        resultado.setNumeroEgresos(resultSet.getInt("EGRESOS"));
                    }
            }
        }
        catch (SQLException e)
        {
            resultado = null;
            System.out.println("sql EXCEPTION al cargar estadisticas flujo --->" + e.getMessage());
            throw new InternalErrorException(e);
        }
        finally
        {
            GeneralOperations.closeStatement(callabledStatement);
            GeneralOperations.closeConnection(connection);
            return resultado;
        }
    }

    public String transformaMes(String mesPalabras){
        String mesNumeros="";

        if(mesPalabras.compareTo("Enero") == 0){
            return mesNumeros="01";
        }
        else if(mesPalabras.compareTo("Febrero") == 0){
            return mesNumeros="02";
        }
        else if(mesPalabras.compareTo("Marzo") == 0){
            return mesNumeros="03";
        }
        else if(mesPalabras.compareTo("Abril") == 0){
            return mesNumeros="04";
        }
        else if(mesPalabras.compareTo("Mayo") == 0){
            return mesNumeros="05";
        }
        else if(mesPalabras.compareTo("Junio") == 0){
            return mesNumeros="06";
        }
        else if(mesPalabras.compareTo("Julio") == 0){
            return mesNumeros="07";
        }
        else if(mesPalabras.compareTo("Agosto") == 0){
            return mesNumeros="08";
        }
        else if(mesPalabras.compareTo("Septiembre") == 0){
            return mesNumeros="09";
        }
        else if(mesPalabras.compareTo("Octubre") == 0){
            return mesNumeros="10";
        }
        else if(mesPalabras.compareTo("Noviembre") == 0){
            return mesNumeros="11";
        }
        else if(mesPalabras.compareTo("Diciembre") == 0){
            return mesNumeros="12";
        }
        return mesNumeros;
    }
}


